/*******************************************************************************
* This file is part of the Coporate Semantic Web Project.
*
* This work has been partially supported by the ``InnoProfile-Corporate Semantic Web" project funded by the German Federal
* Ministry of Education and Research (BMBF) and the BMBF Innovation Initiative for the New German Laender - Entrepreneurial Regions.
*
* http://www.corporate-semantic-web.de/
*
*
* Freie Universitaet Berlin
* Copyright (c) 2007-2013
*
*
* Institut fuer Informatik
* Working Group Coporate Semantic Web
* Koenigin-Luise-Strasse 24-26
* 14195 Berlin
*
* http://www.mi.fu-berlin.de/en/inf/groups/ag-csw/
*
*
*
* This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA or see <http://www.gnu.org/licenses/>
******************************************************************************/
package de.fuberlin.agcsw.svont.changedetection.smartcex;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyID;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.profiles.OWL2ELProfile;
import org.semanticweb.owlapi.profiles.OWLProfile;
import org.semanticweb.owlapi.profiles.OWLProfileReport;
import org.semanticweb.owlapi.profiles.OWLProfileViolation;
import org.semanticweb.owlapi.reasoner.OWLReasonerFactory;
import org.semanticweb.owlapi.util.NonMappingOntologyIRIMapper;
import com.clarkparsia.pellet.owlapiv3.PelletReasonerFactory;
import de.fuberlin.agcsw.svont.changedetection.smartcex.profiles.CEXOWL2ELProfile;
import de.fuberlin.agcsw.svont.changedetection.smartcex.profiles.PelletOWL2ELProfile;
/**
* @author ralph
*
*/
public class PartitionEL {
enum ReasonerCompatibilityMode {
NONE(OWL2ELProfile.class, null),
PELLET(PelletOWL2ELProfile.class, new PelletReasonerFactory()),
CEX(CEXOWL2ELProfile.class, null);
private Class<? extends OWLProfile> profileClass;
private OWLReasonerFactory reasonerFactory;
private ReasonerCompatibilityMode(Class<? extends OWLProfile> profileClass, OWLReasonerFactory reasonerFactory) {
this.profileClass = profileClass;
this.reasonerFactory = reasonerFactory;
}
private Class<? extends OWLProfile> getProfileClass() {
return profileClass;
}
private OWLReasonerFactory getReasonerFactory() {
return reasonerFactory;
}
}
/**
* Splits the given ontology into two partitions: The set of OWL EL
* compliant axioms and the set of axioms which are not compliant with the
* OWL EL profile. The EL compliant partition is stored in the left part of
* resulting pair, and the EL non-compliant partition is stored in the right
* part.
*
* @param sourceOnto
* The source ontology to be partitioned.
* @param compatibilityMode
* Specifies the reasoner with which the resulting partition
* should be compatible (e.g. Pellet has a different notion of EL
* than other reasoners).
* @return A pair containing two ontologies. The left part is the partition
* of the source ontology with all EL-compliant axioms. The right
* part is the partition of the source ontology with all
* non-EL-compliant axioms. If the source ontology already conforms
* to the OWL-EL profile, then the left part of the result contains
* the source ontology, and the right part is null.
* @throws OWLOntologyCreationException
* If there is an error loading the source ontology.
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static Pair<OWLOntology, OWLOntology> partition(OWLOntology sourceOnto, ReasonerCompatibilityMode compatibilityMode)
throws OWLOntologyCreationException, InstantiationException, IllegalAccessException {
OWLProfile elProfile = compatibilityMode.getProfileClass().newInstance();
OWLProfileReport report = elProfile.checkOntology(sourceOnto);
if (report.isInProfile()) {
return new ImmutablePair<OWLOntology, OWLOntology>(sourceOnto, null);
}
HashSet<OWLAxiom> nonELAxioms = new HashSet<OWLAxiom>();
Set<OWLProfileViolation> violations = report.getViolations();
for (OWLProfileViolation violation : violations) {
nonELAxioms.add(violation.getAxiom());
}
OWLOntologyID ontologyID = sourceOnto.getOntologyID();
IRI ontologyIRI = ontologyID.getOntologyIRI();
IRI targetELOntologyIRI = IRI.create(ontologyIRI.toString() + "/ELpart");
IRI targetNonELOntologyIRI = IRI.create(ontologyIRI.toString() + "/nonELpart");
OWLOntologyManager targetELOntoManager = OWLManager.createOWLOntologyManager();
targetELOntoManager.addIRIMapper(new NonMappingOntologyIRIMapper());
OWLOntology targetELOnto = targetELOntoManager.createOntology(new OWLOntologyID(targetELOntologyIRI));
OWLOntologyManager targetNonELOntoManager = OWLManager.createOWLOntologyManager();
targetNonELOntoManager.addIRIMapper(new NonMappingOntologyIRIMapper());
OWLOntology targetNonELOnto = targetNonELOntoManager.createOntology(new OWLOntologyID(targetNonELOntologyIRI));
Set<OWLAxiom> allAxioms = sourceOnto.getAxioms();
for (OWLAxiom axiom : allAxioms) {
if (nonELAxioms.contains(axiom)) {
targetNonELOntoManager.addAxiom(targetNonELOnto, axiom);
System.out.println("- " + axiom);
} else {
targetELOntoManager.addAxiom(targetELOnto, axiom);
System.out.println("+ " + axiom);
}
}
return new ImmutablePair<OWLOntology, OWLOntology>(targetELOnto, targetNonELOnto);
}
/**
* Splits the given ontology into two partitions: The set of OWL EL
* compliant axioms and the set of axioms which are not compliant with the
* OWL EL profile. The EL compliant partition is stored in the left part of
* resulting pair, and the EL non-compliant partition is stored in the right
* part.
*
* @param input
* The IRI from where the source ontology can be loaded.
* @param compatibilityMode
* Specifies the reasoner with which the resulting partition
* should be compatible (e.g. Pellet has a different notion of EL
* than other reasoners).
* @return A pair containing two ontologies. The left part is the partition
* of the source ontology with all EL-compliant axioms. The right
* part is the partition of the source ontology with all
* non-EL-compliant axioms. If the source ontology already conforms
* to the OWL-EL profile, then the left part of the result contains
* the source ontology, and the right part is null.
*
* @throws OWLOntologyCreationException
* If there is an error loading the source ontology.
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static Pair<OWLOntology, OWLOntology> partition(IRI input, ReasonerCompatibilityMode compatibilityMode) throws OWLOntologyCreationException, InstantiationException, IllegalAccessException {
OWLOntologyManager sourceOntoManager = OWLManager.createOWLOntologyManager();
sourceOntoManager.addIRIMapper(new NonMappingOntologyIRIMapper());
OWLOntology sourceOnto = sourceOntoManager.loadOntologyFromOntologyDocument(input);
return partition(sourceOnto, compatibilityMode);
}
public static void main(String[] args) {
if (args.length != 4) {
usage();
}
String compatibilityModeStr = args[0];
ReasonerCompatibilityMode compatiblilityMode = null;
try {
compatiblilityMode = ReasonerCompatibilityMode.valueOf(compatibilityModeStr);
} catch (IllegalArgumentException e) {
usage();
}
try {
Pair<OWLOntology, OWLOntology> result = partition(IRI.create(new File(args[1])), compatiblilityMode);
result.getLeft().getOWLOntologyManager().saveOntology(result.getLeft(), IRI.create(new File(args[2])));
result.getRight().getOWLOntologyManager().saveOntology(result.getRight(), IRI.create(new File(args[3])));
} catch (Exception e) {
e.printStackTrace();
}
}
private static void usage() {
System.out.println("Usage:");
System.out.println("java de.fuberlin.agcsw.svont.changedetection.smartcex.PartionEL <COMPATIBILITY_MODE> <SOURCE_ONTOLOGY_URI> <TARGET_EL_PARTITION_URI> <TARGET_NON_EL_PARTITION_URI>");
System.out.print("Where <COMPATIBILITY_MODE> must be one of: ");
ReasonerCompatibilityMode[] modes = ReasonerCompatibilityMode.values();
for(int i=0; i < modes.length; i++) {
System.out.print(modes[i]);
if (i != modes.length - 1) {
System.out.print(", ");
}
}
System.exit(1);
}
}